﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using System.Data;

/*
        NOTA IMPORTANTE, PARA EJECUTAR LAS PRUEBAS DE N UNIT, LA BASE DE DATOS DENOMINADA EMILIO, DEBE ESTAR VACIA.
 */

namespace pruebasNunit
{
    [TestFixture]
    public class Pruebas
    {

        // Recursos humanso para probar.
        HumanResource recursoA, recursoB, recursoC;
        CtrlHumanResource ctrlRecursoHumano;
        CtrlBDHumanResource ctrlBDRecursoHumano;

        [SetUp]
        // Inicializador de los sets de pruebas.
        public void inicializar() {
            ctrlRecursoHumano = new CtrlHumanResource();
            ctrlBDRecursoHumano = new CtrlBDHumanResource();
        }

        [Test]
        // Set de pruebas para la entidad de recursos humanos.
        public void prueba() {
            // Creo tres recursos.
            recursoA = new HumanResource("usuario1", "pass1", "Nombre1", "Apellido1", "a1@a.com", "2222-2222", 1, 1);
            recursoB = new HumanResource("usuario2", "pass2", "Nombre2", "Apellido2", "a2@a.com", "2222-2222", 1, 1);
            recursoC = new HumanResource("usuario3", "pass3", "Nombre3", "Apellido3", "a3@a.com", "2222-2222", 1, 1);

            // Compruebo que son diferentes.
            Assert.AreNotEqual(recursoA.sUsername, recursoB.sUsername);
            Assert.AreNotEqual(recursoB.sUsername, recursoC.sUsername);
            Assert.AreNotEqual(recursoA.sUsername, recursoC.sUsername);

            // Y compruebo que se crearon con los datos dichos y que aun los tiene.
            Assert.AreEqual(recursoA.sUsername, "usuario1");
            Assert.AreEqual(recursoB.sUsername, "usuario2");
            Assert.AreEqual(recursoC.sUsername, "usuario3");

            Assert.AreEqual(recursoA.sPassword, "pass1");
            Assert.AreEqual(recursoB.sPassword, "pass2");
            Assert.AreEqual(recursoC.sPassword, "pass3");

            Assert.AreEqual(recursoA.sEmail, "a1@a.com");
            Assert.AreEqual(recursoB.sEmail, "a2@a.com");
            Assert.AreEqual(recursoC.sEmail, "a3@a.com");
        }

        [Test]
        // Set de pruebas para insertar recurso humano
        public void pruebaInsertarRecursoHumano (){

            // Creo tres recursos.
            recursoA = new HumanResource("usuario1", "pass1", "Nombre1", "Apellido1", "a1@a.com", "2222-2222", 1, 1);
            recursoB = new HumanResource("usuario2", "pass2", "Nombre2", "Apellido2", "a2@a.com", "2222-2222", 1, 1);
            recursoC = new HumanResource("usuario3", "pass3", "Nombre3", "Apellido3", "a3@a.com", "2222-2222", 1, 1);

            // Agrega Recursos Humanos a la base de datos.
            ctrlRecursoHumano.addHumanResource(recursoA.sUsername, recursoA.sFirstName, recursoA.sLastName, recursoA.sPassword, recursoA.sPhone, recursoA.sEmail, recursoA.iRole, recursoA.iProfile);
            ctrlRecursoHumano.addHumanResource(recursoB.sUsername, recursoB.sFirstName, recursoB.sLastName, recursoB.sPassword, recursoB.sPhone, recursoB.sEmail, recursoB.iRole, recursoB.iProfile);
            ctrlRecursoHumano.addHumanResource(recursoC.sUsername, recursoC.sFirstName, recursoC.sLastName, recursoC.sPassword, recursoC.sPhone, recursoC.sEmail, recursoC.iRole, recursoC.iProfile);

            // Obtiene todos los recursos humanos.
            DataSet dataset = ctrlRecursoHumano.getData();
            DataTable data = dataset.Tables[0];
            HumanResource[] recursos = converter(data, recursoA);

            // Comprueba que si ingresaron y se consultaron bien de la base de datos.
            Assert.AreEqual(recursoA.sFirstName, recursos[0].sFirstName);
            Assert.AreEqual(recursoB.sFirstName, recursos[1].sFirstName);
            Assert.AreEqual(recursoC.sFirstName, recursos[2].sFirstName);

            ctrlRecursoHumano.deleteHumanResource(recursos[0].iId);
            ctrlRecursoHumano.deleteHumanResource(recursos[1].iId);
            ctrlRecursoHumano.deleteHumanResource(recursos[2].iId);
        }

        [Test]
        // Set de pruebas para eliminar recurso humano
        public void pruebaEliminarRecursoHumano()
        {

            // Creo tres recursos.
            recursoA = new HumanResource("usuario1", "pass1", "Nombre1", "Apellido1", "a1@a.com", "2222-2222", 1, 1);
            recursoB = new HumanResource("usuario2", "pass2", "Nombre2", "Apellido2", "a2@a.com", "2222-2222", 1, 1);
            recursoC = new HumanResource("usuario3", "pass3", "Nombre3", "Apellido3", "a3@a.com", "2222-2222", 1, 1);

            // Agrega Recursos Humanos a la base de datos.
            ctrlRecursoHumano.addHumanResource(recursoA.sUsername, recursoA.sFirstName, recursoA.sLastName, recursoA.sPassword, recursoA.sPhone, recursoA.sEmail, recursoA.iRole, recursoA.iProfile);
            ctrlRecursoHumano.addHumanResource(recursoB.sUsername, recursoB.sFirstName, recursoB.sLastName, recursoB.sPassword, recursoB.sPhone, recursoB.sEmail, recursoB.iRole, recursoB.iProfile);
            ctrlRecursoHumano.addHumanResource(recursoC.sUsername, recursoC.sFirstName, recursoC.sLastName, recursoC.sPassword, recursoC.sPhone, recursoC.sEmail, recursoC.iRole, recursoC.iProfile);

            // Obtiene todos los recursos humanos.
            DataSet dataset = ctrlRecursoHumano.getData();
            DataTable data = dataset.Tables[0];
            HumanResource[] recursos = converter(data, recursoA);

            // Elimino los recursos de la base de datos.
            ctrlRecursoHumano.deleteHumanResource(recursos[0].iId);
            ctrlRecursoHumano.deleteHumanResource(recursos[1].iId);
            ctrlRecursoHumano.deleteHumanResource(recursos[2].iId);

            // Compruebo que se eliminaron los elementos de la BD de pruebas.
            dataset = ctrlRecursoHumano.getData();
            data = dataset.Tables[0];

            // Aqui se compara
            Assert.AreEqual(data.Rows.Count, 0);
        }

        [Test]
        // Set de pruebas para modificar recurso humano
        public void pruebaModificarRecursoHumano()
        {
            // Creo tres recursos.
            recursoA = new HumanResource("usuario1", "pass1", "Nombre1", "Apellido1", "a1@a.com", "2222-2222", 1, 1);
            recursoB = new HumanResource("usuario2", "pass2", "Nombre2", "Apellido2", "a2@a.com", "2222-2222", 1, 1);
            recursoC = new HumanResource("usuario3", "pass3", "Nombre3", "Apellido3", "a3@a.com", "2222-2222", 1, 1);

            // Agrega Recursos Humanos a la base de datos.
            ctrlRecursoHumano.addHumanResource(recursoA.sUsername, recursoA.sFirstName, recursoA.sLastName, recursoA.sPassword, recursoA.sPhone, recursoA.sEmail, recursoA.iRole, recursoA.iProfile);
            ctrlRecursoHumano.addHumanResource(recursoB.sUsername, recursoB.sFirstName, recursoB.sLastName, recursoB.sPassword, recursoB.sPhone, recursoB.sEmail, recursoB.iRole, recursoB.iProfile);
            ctrlRecursoHumano.addHumanResource(recursoC.sUsername, recursoC.sFirstName, recursoC.sLastName, recursoC.sPassword, recursoC.sPhone, recursoC.sEmail, recursoC.iRole, recursoC.iProfile);

            // Obtiene todos los recursos humanos.
            DataSet dataset = ctrlRecursoHumano.getData();
            DataTable data = dataset.Tables[0];
            HumanResource[] recursos = converter(data, recursoA);

            recursoA.iId = recursos[0].iId;     recursoA.sFirstName = "Name1";
            recursoB.iId = recursos[1].iId;     recursoB.sFirstName = "Name2";
            recursoC.iId = recursos[2].iId;     recursoC.sFirstName = "Name3";

            ctrlBDRecursoHumano.setHumanResource(recursoA);
            ctrlBDRecursoHumano.setHumanResource(recursoB);
            ctrlBDRecursoHumano.setHumanResource(recursoC);

            // Obtiene todos los recursos humanos.
            dataset = ctrlRecursoHumano.getData();
            data = dataset.Tables[0];
            recursos = converter(data, recursoA);

            // Comprueba que si ingresaron y se consultaron bien de la base de datos.
            Assert.AreEqual(recursos[0].sFirstName, "Name1");
            Assert.AreEqual(recursos[1].sFirstName, "Name2");
            Assert.AreEqual(recursos[2].sFirstName, "Name3");

            ctrlRecursoHumano.deleteHumanResource(recursos[0].iId);
            ctrlRecursoHumano.deleteHumanResource(recursos[1].iId);
            ctrlRecursoHumano.deleteHumanResource(recursos[2].iId);
        }


        // Convierte un DataTable en un arreglo de recusos humanos
        private HumanResource[] converter(DataTable data, HumanResource resource) {

            HumanResource[] recursos = new HumanResource[data.Rows.Count];

            for (int x = 0; x != data.Rows.Count; ++x)
            {
                recursos[x] = new HumanResource();
            }

            int i = 0;

            foreach (DataRow row in data.Rows)
            {
                recursos[i].iId = Convert.ToInt32(row["Id"].ToString());
                recursos[i].sFirstName = row["Name"].ToString();
                ++i;
            }
            return recursos;
        }

    }
}
